#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/time.h>
#include <math.h>
#include <omp.h>
#include <mpi.h>

#define BLOCKSIZE 65000     //tamanho do bloco necessario para ler o arquivo

int *recvcount;
int *displs;
int ind;

typedef struct {
    char *content;  //todo o conteudo do arquivo
    double **matrizA;   //toda a matriz A
    double *vectorB;    //todo o vetor B
    double *line_test;  //linha da equacao obtida da linha da matriz A + elemento vetorB para verificar resultados
    int iterations;     //numero total de interacoes
    unsigned long int size;     //tamanho do arquivo
    int J_ORDER;    //ordem da matriz A e do vetor B
    int J_ROW_TEST; //indice da linha da matriz A a ser testada
    double J_ERROR; //erro admitido no metodo jacobi
    int J_ITE_MAX;  //numero maximo de interacoes
    int LINES_PER_PROC; //numero media de linhas da matriz A para cada no
    int rest;   //se sobrou alguma linha da matriz A da relacao J_ORDER/numero_de_nos, entao guarda nessa variavel
    int count;  //contador que diz qual a partir de qual linha da matriz A, a funcao GetLines vai retornar para distribuir entre os nos
} FileStruct;

FileStruct *file;

short int ReadFile(char *);     //le todo o arquivo e armazena na memoria

short int AllocateData(int);       //le todas as informacoes do arquivo

short int ManipulateData(void);     //divide a matrizA e o vetorB pela diagonal da linha, alem de armazenar a linha da matrizA a ser testada

void SetParameters(int);        //determina o LINES_PER_PROC, rest e inicializa count=0

int GetAmountLines(void);       //informa a quantidade de linhas da matrizA para um determinado no

void GetLines(double *, int, int *);   //aloca na matriz passada as linhas da matrizA referente a aquele no

void CalculateError(double *, double *, double *);  //calculo o erro segundo o metodo jacobi richardson

void ShowElapsedTime(struct timeval *, struct timeval *);   //mostra o tempo decorrido
